STM32 DMA 循环模式DMA |
您所在的位置:网站首页 › gd32 dma spi › STM32 DMA 循环模式DMA |
系列文章目录
目前在网上还没看到详细讲解DMA循环模式的文章,参考手册中只有简单的一段话: DMA循环模式可用于循环队列,可通过DMA+空闲中断+循环队列,实现高效接收数据,然后对数据进行处理。 本文将讲解DMA循环模式与普通模式在实现效果上的区别,及为何循环模式要如此配置才能实现循环队列。 一、循环模式与普通模式1、普通模式: 在普通模式下,接收完一次数据后,CNDTR自动清0,需要先关闭DMA,重置CNDTR,然后再开启DMA。 通过接收两次数据来加以介绍: 假设部分配置如下: DMA_InitStructure.DMA_MemoryBaseAddr =&RxBuff[0]; //RxBuff一共有10个字节 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_BufferSize = 7; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;第一步:DMA接收5个字节的数据 接收前,CNDTR=7。接收完数据后如下图所示: 2、循环模式: 接收完一次数据后,CNDTR不清0,可继续接收下一次的数据。具体的实现看后面讲解。 二、循环模式的配置及实现效果 1.循环模式的实现效果假设部分配置如下: DMA_InitStructure.DMA_MemoryBaseAddr =&RxBuff[0]; //RxBuff一共有10个字节 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_BufferSize = 10; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;第一步:DMA接收5个字节的数据 接收前,CNDTR=10。接收完数据后如下图所示: 第二步:DMA接收6个字节的数据 接收前,CNDTR=5,接收6个字节的数据后如下图所示: 配置一: DMA_InitStructure.DMA_MemoryBaseAddr =&RxBuff[0]; //RxBuff一共有10个字节DMA开始存储数据的起始地址要设置在缓存的第一个字节处。 配置二: DMA_InitStructure.DMA_BufferSize = 10;CNDTR的值要和缓存的大小相同(数字10只是这个例子中缓存的大小)。 为何必须要做这两项配置: 只有如此才能在数据存储到缓存末尾时,让CNDTR=0,然后DMA自动重置CNDTR,并将存储地址重置为缓存的第一个字节。 总结本文详细讲解了DMA的循环模式和普通模式的实现效果及其区别。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |